package com.bjh.netty.codec;

import com.bjh.netty.message.RpcMessage;
import com.bjh.serialization.ProtostuffSerialization;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.nio.charset.Charset;
import java.util.List;

public class RpcDecoder extends ByteToMessageDecoder {


    private Class<?> genericClass;

    public RpcDecoder(Class<?> genericClass) {
        this.genericClass = genericClass;
    }

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> out) throws Exception {

//        if(in.readableBytes() < 4) {
//            return;
//        }
//
//        //拿到数据长度
//        int dataLength = in.readInt();
//
//        if(in.readableBytes() < dataLength) {
//            //表示读取的数据还不够
//            in.resetReaderIndex();
//            return;
//        }
//
//        //拿到数据内容
//        byte[] bodyBytes = new byte[dataLength];
//        in.readBytes(bodyBytes);
//
//        String body = new String(bodyBytes);
//
//        RpcMessage rpcMessage = new RpcMessage();
//        rpcMessage.setDataLength(body.getBytes(Charset.forName("utf-8")).length);
//        rpcMessage.setObj(body);
//
//        out.add(rpcMessage);

        if(in.readableBytes() < 4) {
            return;
        }
        in.markReaderIndex();
        int dataLength = in.readInt();
        if(dataLength < 0) {
            channelHandlerContext.close();
        }
        if(in.readableBytes() < dataLength) {
            in.resetReaderIndex();
            return;
        }
        byte[] data = new byte[dataLength];
        in.readBytes(data);
        Object obj = ProtostuffSerialization.deserialize(data,genericClass);
        out.add(obj);
    }
}
